package com.zzyk.main.configuration.shiro.matcher;


import com.zzyk.main.model.pojo.SysUser;
import com.zzyk.main.utils.MD5Utils;
import org.apache.shiro.authc.AuthenticationInfo;
import org.apache.shiro.authc.AuthenticationToken;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.authc.credential.SimpleCredentialsMatcher;

public class UserCredentialsMatcher extends SimpleCredentialsMatcher {

    /**
     * 用来检查认证信息
     *
     * @param token 登陆者的令牌(网页上输入的登录信息)
     * @param info  登陆者要登录的身份(数据库查出来的用户信息)
     * @return 如果认证通过则返回true
     */
    @Override
    public boolean doCredentialsMatch(AuthenticationToken token, AuthenticationInfo info) {
        // 用户登录信息
        UsernamePasswordToken usernamePasswordToken = (UsernamePasswordToken) token;
        // 数据库里的用户信息
        SysUser user = (SysUser) info.getPrincipals().getPrimaryPrincipal();

        // 数据库里的用户密码 在UserRealm中放进来的
        String password = (String) info.getCredentials();
        // 经过加密后的用户密码
        // 这个加密逻辑我觉得很简单了 但要注意java的data类型的毫秒数比mysql中的datetime要大1000倍
        // 因此要将java类中的日期取得的毫秒数除1000再进行计算或比较
        String sign = MD5Utils.sign(String.valueOf(usernamePasswordToken.getPassword()) + user.getCreateTime().getTime() / 1000);

        return password.equalsIgnoreCase(sign);
    }
}
